上几周给公司app做了一个html5嵌套页面,页面并不复杂,展示内容较多,底部有footer
html结构如下
<style>
.main{
position: absolute;
top: 0;
bottom: 88px;
left: 0;
width: 100%;
overflow-y: auto;
}
footer{
position: fixed;
left: 0;
bottom: 0;
width: 100%;
}
<style>
<body>
<div class="main">
...
</div>
<footer></footer>
</body>
内容调试完成后插入了一些其他项目的事,后来app开发告诉我要监听页面scroll让我不要用定位布局。我看页面上没有可以输入的地方,不会出现fixed元素乱跑的事情。于是main部分改成了普通布局,然后就出了bug:
安卓上一切正常,IOS10上有时进入页面的时候footer不显示,拖拽或者双击之后才会显示(其他版本的IOS测试说有的又是正常的)
遇到这个问题第一个想法就是把footer的z-index调高,设置到1000,结果无用。仔细观察不显示的页面他们的内容部分都很短,没有撑到footer的位置,猜想是body高度问题,给body加上样式调试
background: #fafafa;
min-height: 100vh;
整个页面背景确实变灰了,但是footer依旧不显示
和同事讨论之后,猜测是手机渲染出了层级问题,一开始footer没有渲染出来,click或者touchmove之后页面重新渲染footer就正常了。
当时已经临近上线了,为了尽快解决bug不折腾,给footer设置了tanslateZ,这样相当于创建了一个独立的层级
-webkit-transform: translateZ(1px)
transform: translate(1px)
为了不影响正常页面,对高度不足一屏的情况做判断
if (document.documentElement.offsetHeight < window.screen.height) {
var footer = document.querySelector('footer')
footer.style.WebkitTransform = 'translateZ(1px)'
footer.style.transform = 'translateZ(1px)'
}
页面上还有1个弹层设置了z-index,footer有了translate弹层覆盖不住,说明tranzlateZ层级更高。弹层设置了translateZ(2px)就正常了
这个方法不太优雅,但好处在不改变布局,情况紧急的时候下还是适用的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。